/**
 * 开始移动
 * 得到自己的位置
 * 判断要移动方向的下一个位置是什么 是墙还是空白等
 * 如果是墙，需要进行二次判断
 * 第一次，如果墙的下一个位置还是墙，就return false 不让移动
 * 第二次，如果墙的一下位置不是墙，是空白，或者是正确的位置，那么就可以移动
 * 如果是空白，就移动
 * 如果
 */

import * as map from "./map.js"

//开始移动
export function playMove(direction) {
    var playPoint = onPlayPoint() //得到玩家的位置
    var nextPoint = onNextPoint(playPoint.row, playPoint.col, direction) //根据方向，判断玩家下一次移动的位置是什么

    //下一次位置是墙，不移动
    if (nextPoint.value === map.WALL) {
        return false
    }

    //一次是空白，移动
    if (nextPoint.value === map.SPACE) {
        //下一次位置是空白，可以移动
        exchange(playPoint, nextPoint)
        return true
    } else {
        //下一次移动的位置是箱子
        var nextNextPoint = onNextPoint(nextPoint.row, nextPoint.col, direction)
        if (nextNextPoint.value === map.SPACE) {
            exchange(nextPoint, nextNextPoint)
            exchange(playPoint, nextPoint)
            return true
        } else {
            return false
        }
    }
}

export function isWin() {
    for (let i = 0; i < map.correct.length; i++) {
        var value = map.correct[i]
        if (map.content[value.row][value.col] !== map.BOX) {
            return false
        }
    }
    return true
}

function exchange(playPoint, nextPoint) {
    var temp = map.content[playPoint.row][playPoint.col] //记录玩家的位置
    map.content[playPoint.row][playPoint.col] = map.content[nextPoint.row][nextPoint.col] //玩家的位置移动到一下次的位置
    map.content[nextPoint.row][nextPoint.col] = temp //下一次要移动的位置走到玩家的位置，这样就完成了位置的交换
}

function onNextPoint(row, col, direction) {
    if (direction == 'up') {
        return {
            row: row - 1,
            col: col,
            value: map.content[row - 1][col]
        }
    } else if (direction == 'down') {
        return {
            row: row + 1,
            col: col,
            value: map.content[row + 1][col]
        }
    } else if (direction == 'right') {
        return {
            row: row,
            col: col + 1,
            value: map.content[row][col + 1]
        }
    } else if (direction == 'left') {
        return {
            row: row,
            col: col - 1,
            value: map.content[row][col - 1]
        }
    }
}

//得到玩家的位置
function onPlayPoint() {
    for (let row = 0; row < map.rowNumber; row++) {
        for (let col = 0; col < map.colNumber; col++) {
            if (map.content[row][col] === map.PLAYER) {
                return {
                    row,
                    col
                }
            }
        }
    }
    throw new Error('竟然没有玩家')
}